
// 在函数名之后和参数列表之前使用 <T> 声明泛型
function sum<T>( a: T , b: T ): any{
    if( typeof a === 'number' && typeof b === 'number' ) {
        // 使用 as 实现类型断言
        let result = ( a as number ) + ( b as number ) ;
        return result;
    }
    if( typeof a === 'string' && typeof b === 'string' ){
        return a + b ;
    }
    // 如果两个参数都是对象，则将这两个对象合并到同一个对象中
    if( typeof a === 'object' && typeof b === 'object' ) {
        
        // return { ...a , ...b };

        // return Object.assign( Object.create(null) , a , b );

        let entries = Object.entries(a);
        entries.push( ...Object.entries( b ) );
        return Object.fromEntries( entries );

    }
    // 如果两个参数都是数组，则将两个数组合并到一个新数组中
}

let result = sum<number>( 100 , 200 );
console.log( result );

result = sum<string>( 'hello' , 'kaifamiao' );
console.log( result );

// 自己补充 sum 中两个对象的合并操作
result = sum<object>( { id: 1001 , age: 20 } , { name: '朱亚红' , age: 18 } );
// 使上面的sum运算结果为 { id: 1001 , name: '朱亚红' }
console.log( result );

result = sum<number[]>( [1,3,5,7,9] , [2,4,6,8,10] );
console.log( result );